package com.such.kit.io.bean;

import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.annotation.JSONField;
import com.such.kit.io.simple.support.IOSimple;
import com.such.kit.io.source.DatabaseIOSource;
import com.such.kit.io.support.IOSource;
import com.such.kit.placeholder.PlaceholderCommons;
import com.such.kit.string.StringCommons;
import com.such.kit.validate.ValidateCommons;

/**
 * @author SUCH
 * <pre>
 * SqlIOConfig 相对简单，主要是理解 {@link #inputExpression} 的作用
 * </pre>
 */
public class SqlIOConfig {

	public static final String IO_CHARSET = "IO_CHARSET";
	public static final String IO_SQL_TEMPLATE = "IO_SQL_TEMPLATE";
	public static final String IO_OUTPUT_EXPRESSION = "IO_OUTPUT_EXPRESSION";

	/** charset：数据文件编码 [默认值为 {@link StringCommons#CHARSET_GBK}] [参考 {@link StringCommons}.ENCODE_*] */
	@JSONField(name = IO_CHARSET)
	private String charset = StringCommons.CHARSET_GBK;
	/** sqlTemplate：sql 模板集，可以使用 {@link PlaceholderCommons 占位符} 引用 IO 数据、{@link IOSimple#args 自定义参数} */
	@JSONField(name = IO_SQL_TEMPLATE)
	private List<String> sqlTemplate;
	/**
	 * inputExpression：[导入时] 表达式 [默认值为 {@link DatabaseIOSource#SQL_RESOURCE}]
	 * <pre>
	 * SqlIOConfig 的 inputExpression 相对特殊
	 * 由于 sql 文件的导入，每行数据都是一条可执行 sql 语句，只需要将 sql 语句交给 {@link IOSource} 直接执行便可，inputExpression 变得毫无意义
	 * 目前 inputExpression 的值默认与 {@link DatabaseIOSource} 产生了耦合，其作用是告诉 {@link DatabaseIOSource} 进入”直接执行模式“
	 * </pre>
	 */
	private String inputExpression = DatabaseIOSource.SQL_RESOURCE;
	/**
	 * outputExpression：[导出时] 表达式
	 * <pre>
	 * {@link IOSource} 的不同实现 outputExpression 的推荐值有所变化
	 * 以 {@link DatabaseIOSource} 为例，outputExpression 的推荐值为 sql 语句
	 * [举例] "select schema as schema, name as tableName, comment as tableComment from TABLE_INFO"
	 * </pre>
	 */
	@JSONField(name = IO_OUTPUT_EXPRESSION)
	private String outputExpression;

	/** [参考 {@link #charset}] */
	public String getCharset() {
		return this.charset;
	}

	/** [参考 {@link #charset}] */
	public void setCharset(String charset) {
		this.charset = charset;
	}

	/** [参考 {@link #sqlTemplate}] */
	public List<String> getSqlTemplate() {
		return this.sqlTemplate;
	}

	/** [参考 {@link #sqlTemplate}] */
	public void setSqlTemplate(List<String> sqlTemplate) {
		this.sqlTemplate = sqlTemplate;
	}

	/** [参考 {@link #sqlTemplate}] */
	public void addSqlTemplate(String sqlTemplate) {
		if (ValidateCommons.isEmpty(this.sqlTemplate)) {
			this.sqlTemplate = new ArrayList<String>();
		}
		this.sqlTemplate.add(sqlTemplate);
	}
	
	/** [参考 {@link #inputExpression}] */
	public String getInputExpression() {
		return this.inputExpression;
	}

	/** [参考 {@link #outputExpression}] */
	public String getOutputExpression() {
		return this.outputExpression;
	}

	/** [参考 {@link #outputExpression}] */
	public void setOutputExpression(String outputExpression) {
		this.outputExpression = outputExpression;
	}

}
